const fs = require('fs');
const path = require('path')
var format = require('date-format');
const koaBody = require('koa-body');

const {
    typeFormateError,
    typeIdFormateError,
    typeDoesNotExist,
    typeAlreadyExited,
    typeInsertError
} = require('../constant/err.type')


const multerConfig = async (ctx,next)=>{
  console.log(1111111)
  let fileUrl = ''
  koaBody({
    multipart: true, // 是否支持 multipart-formdate 的表单
    formidable: {
      // 上传目录
      uploadDir: path.join(__dirname, '../static/'),
      // 保留文件扩展名
      keepExtensions: true,
      onFileBegin: async (name, file) => {
        // 无论是多文件还是单文件上传都会重复调用此函数
        // 最终要保存到的文件夹目录
        const dirName = format("yyyyMMddhhmmss", new Date());
        const dir = path.join(__dirname, `../static/upload/${dirName}`);
 
        // 检查文件夹是否存在如果不存在则新建文件夹
        const status = await dirExists(dir)
        if(status) {
          let basename = path.basename(file.path)
         
          // 覆盖文件存放的完整路径(保留原始名称)
          file.path = `${dir}\\${basename}`;
          console.log('currPath',file.path)
          fileUrl = file.path
          // app.context.uploadpath = app.context.uploadpath ? app.context.uploadpath : {};
          // app.context.uploadpath[name] = `${dirName}/${basename}`;
        }
      },
      onError: (error) => {
        app.status = 400;
        log4js.error(error);
        // 这里可以定义自己的返回内容
        app.body = { code: 400, msg: "上传失败", data: {} };
        return;
      },
    }
  }) 

  console.log(fileUrl)
  if(fileUrl) {
    await next()
  }
  
}

/**
 * 读取路径信息
 * @param {string} path 路径
 */
function getStat(path) {
    return new Promise((resolve, reject) => {
        fs.stat(path, (err, stats) => {
            if (err) {
                resolve(false);
            } else {
                resolve(stats);
            }
        })
    })
}

/**
 * 创建路径
 * @param {string} dir 路径
 */
function mkdir(dir) {
    return new Promise((resolve, reject) => {
        fs.mkdir(dir, err => {
            if (err) {
                resolve(false);
            } else {
                resolve(true);
            }
        })
    })
}

/**
 * 路径是否存在，不存在则创建
 * @param {string} dir 路径
 */
async function dirExists(dir) {
    let isExists = await getStat(dir);
    //如果该路径且不是文件，返回true
    if (isExists && isExists.isDirectory()) {
        return true;
    } else if (isExists) { //如果该路径存在但是文件，返回false
        return false;
    }
    //如果该路径不存在
    let tempDir = path.parse(dir).dir; //拿到上级路径
    //递归判断，如果上级目录也不存在，则会代码会在此处继续循环执行，直到目录存在
    let status = await dirExists(tempDir);
    let mkdirStatus;
    if (status) {
        mkdirStatus = await mkdir(dir);
    }
    return mkdirStatus;
}


function getUploadDirName(){
  const date = new Date();
  let month = Number.parseInt(date.getMonth()) + 1;
  month = month.toString().length > 1 ? month : `0${month}`;
  const dir = `${date.getFullYear()}${month}${date.getDate()}`;
  return dir;
}


function getUploadFileExt(name) {
  let ext = name.split('.');
  return ext[ext.length - 1];
}
 




module.exports = {multerConfig,dirExists }